home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / GAMES / P_ROBO31 / NINJA.PR < prev    next >
Text File  |  1989-10-23  |  4KB  |  149 lines

  1. (**************************************************************************)
  2. (*                             W A R N I N G                              *)
  3. (*                                                                        *)
  4. (*  This Robot has NOT been designed to take advantage of the advanced    *)
  5. (*  features of P-ROBOTS, such as, Shields, Fuel, Teams or Obstructions.  *)
  6. (**************************************************************************)
  7.  
  8.   PROCEDURE Ninja;
  9.  
  10.     { Author unknown }
  11.  
  12.     { Based on C-Robot Ninja }
  13.  
  14.     { Locks on to a target and attacks }
  15.  
  16.   VAR vector     : Integer; { current attack vector }
  17.  
  18.  
  19.     PROCEDURE charge(vec, Range, maxspd : Integer); { charge at an enemy }
  20.       { vec : attack vector to use }
  21.       { range : range to target }
  22.       { maxspd : maximum speed to use }
  23.     BEGIN 
  24.       IF (Range > 40) AND (Range < 800) THEN { good shooting range }
  25.         IF ObjectScanned = Enemy
  26.           THEN cannon(vec, Range); { fire! }
  27.       drive(vec, maxspd); { charge! }
  28.     END; { charge }
  29.  
  30.  
  31.     FUNCTION Pin(vec : Integer) : Integer; { pin down a target }
  32.       { vec :  initial vector }
  33.     VAR
  34.       tv             : Integer; { trial vector }
  35.       ts             : Integer; { trial scan results }
  36.       n              : Integer; { index }
  37.       return         : Integer;
  38.     BEGIN
  39.       tv := vec-10; { coarse screen }
  40.       n := 2;
  41.       ts := scan(tv, 10);
  42.       WHILE (n > 0) AND (ts = 0) DO
  43.         BEGIN
  44.           tv := tv+20;
  45.           n := n-1;
  46.           ts := scan(tv, 10);
  47.         END;
  48.       IF ts = 0
  49.       THEN return := 0
  50.       ELSE BEGIN
  51.         charge(tv, ts, 50);
  52.  
  53.         tv := tv-10; { medium screen }
  54.         n := 4;
  55.         ts := scan(tv, 5);
  56.         WHILE (n > 0) AND (ts = 0) DO
  57.           BEGIN
  58.             tv := tv+10;
  59.             n := n-1;
  60.             ts := scan(tv, 5);
  61.           END;
  62.  
  63.         IF ts = 0
  64.         THEN return := 0
  65.         ELSE BEGIN
  66.           charge(tv, ts, 50);
  67.  
  68.           tv := tv-4; { fine screen }
  69.           n := 3;
  70.           ts := scan(tv, 2);
  71.           WHILE (n > 0) AND (ts = 0) DO
  72.             BEGIN
  73.               tv := tv-4;
  74.               n := n-1;
  75.               ts := scan(tv, 2);
  76.             END;
  77.  
  78.           IF ts = 0
  79.           THEN return := 0
  80.           ELSE BEGIN { found it! }
  81.             return := ts; { say how far away it is }
  82.             vector := tv;
  83.           END;
  84.         END; { fine screen }
  85.       END; { medium screen }
  86.  
  87.       Pin := return;
  88.     END; { Pin }
  89.  
  90.  
  91.     PROCEDURE attack;
  92.     VAR
  93.       Range          : Integer; { range to locked target }
  94.       return         : Boolean;
  95.     BEGIN
  96.       return := False;
  97.       REPEAT
  98.         Range := scan(vector, 0);
  99.         IF (Range > 0)
  100.         THEN charge(vector, Range, 100) { got him! }
  101.         ELSE IF Pin(vector) = 0 THEN { lost him! }
  102.           return := True; { can't find him }
  103.       UNTIL return;
  104.     END; { Attack }
  105.  
  106.  
  107.     FUNCTION Find  : Integer; { find a new target }
  108.     VAR
  109.       off            : Integer; { offset }
  110.       dir            : Boolean; { direction }
  111.       tv             : Integer; { trial vector }
  112.       return         : Integer;
  113.  
  114.     BEGIN {Find}
  115.       off := 180; { half circle sweep }
  116.       dir := False; { counter-clockwise first }
  117.       tv := (vector+180) MOD 360; { look behind us first }
  118.       return := 0; {no target found - default}
  119.  
  120.       WHILE (off >= 0) AND (return = 0) DO { full scan }
  121.         BEGIN
  122.           IF (scan(tv, 10) > 0) THEN { see anyone? }
  123.             return := Pin(tv); { nail him! }
  124.           dir := NOT dir;
  125.           IF dir { alternate sides }
  126.           THEN BEGIN
  127.             off := off-20;
  128.             tv := vector+off;
  129.           END
  130.           ELSE tv := vector-off+360;
  131.           tv := tv MOD 360;
  132.         END;
  133.  
  134.       Find := return;
  135.     END; {Find}
  136.  
  137.  
  138.   BEGIN {Ninja Main}
  139.     vector := Random(360);
  140.     REPEAT
  141.       IF (speed = 0) THEN drive(vector, 30)
  142.       ELSE IF (Find > 0)
  143.       THEN attack { if we see anyone attack }
  144.       ELSE vector := Random(360);
  145.     UNTIL Dead OR Winner;
  146.   END; {Ninja Main}
  147.  
  148.  
  149.